// hdu3562
// 题意：一个图有n(n<=1000)个点。这个图是由特殊规则构成，
//       初始3个点两两相连，然后接下来一次加入剩余的点，
//       加入的点都是向直接相连的点(xi, yi)分别连无向边。
//       现在问，随便从一个点开始经过一些点回到起始点，最多
//       可以经过多少个点。边和点都最多只能经过一次（除了初始点）。
//
// 题解：奥妙重重。首先要看清题目，每次都是利用一条直接相连的边
//       来加入新的点，这样得到的图是一个平面图。然后也很容易观察出来，
//       对于每个三角形，三条边出去的图形是不可能相交的。（求严格证明）
//
//       并且我们发现，一个一个加点是单向性的，所以选定方向后是没后效性的。
//
//       然后我们思考每次都是给一条边加上一个点连接起来，这是状态的改变，
//       所以我们可以设计这样一个状态，f[i][j]表示连接i到j最多经过的点数。
//
//       因为新加入的点不影响前面的点，所以我们从后往前不断更新
//       （可以画个图感觉一下），更新也很简单，假如说当前枚举到的点是i，
//       它要连接l和r，那么f[l][r] = f[r][l] = max(f[l][r], f[l][i] + f[r][i])
//
//       然后不断通过l-r-i这个三角形来更新答案, 即:
//       	ans = max(ans, f[l][r] + f[l][i] + f[r][i])
//       最后别忘了用最初的三角形更新答案就行。
//
// run: $exec < input
#include <iostream>
#include <utility>
#include <cstring>

int const maxn = 1007;
std::pair<int, int> edges[maxn];
int f[maxn][maxn];
int n;

void init()
{
	std::memset(f, 0, sizeof(f));
	f[1][2] = f[2][1] = f[2][3] = f[3][2] = f[1][3] = f[3][1] = 1;
}

int main()
{
	std::ios::sync_with_stdio(false);
	while (std::cin >> n) {
		init();

		for (int i = 4; i <= n; i++) {
			std::cin >> edges[i].first >> edges[i].second;
			f[edges[i].first][i] = f[i][edges[i].first] = 1;
			f[edges[i].second][i] = f[i][edges[i].second] = 1;
		}

		int ans = 0;
		for (int i = n; i > 3; i--) {
			int l = edges[i].first, r = edges[i].second;
			ans = std::max(ans, f[l][i] + f[r][i] + f[l][r]);
			f[l][r] = f[r][l] = std::max(f[l][r], f[l][i] + f[r][i]);
		}
		ans = std::max(ans, f[1][2] + f[1][3] + f[2][3]);
		std::cout << ans << '\n';
	}
}

